package com.mycompany.sigemp.web;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.mycompany.sigemp.model.Cliente;
import com.mycompany.sigemp.model.Detalle;
import com.mycompany.sigemp.model.Maquinaria;
import com.mycompany.sigemp.model.Pedido;
import com.mycompany.sigemp.service.ClienteService;
import com.mycompany.sigemp.service.MaquinariaService;
import com.mycompany.sigemp.service.PedidoService;

@Controller
public class PedidoController {
	@Autowired
	PedidoService pService;
	@Autowired
	ClienteService cService;
	@Autowired
	MaquinariaService mService;
	
	private static Log logger = LogFactory.getLog(PedidoController.class);
	
	@RequestMapping(value="/buscarPedido.htm", method=RequestMethod.GET)
	public String vistaBuscarPedido(){
		return "viewBuscarPedido";
	}
	
	@RequestMapping(value="/buscarPedido.htm",method=RequestMethod.POST)
	public String procesarBusqueda(@RequestParam String txtCodigo, Model model){
		if(txtCodigo.equals("")){
			return "viewBuscarPedido";
		}
		Pedido pedido = pService.obtnerPedidoPorCodigo(txtCodigo);
		if(pedido == null){
			return "viewBuscarPedido";
		}
		String vista;
		if(pedido.getEstado().equals("Cancelado")){
			vista = "viewPedidoPagado";
		}else{
			vista = "viewPedido";
		}
		Cliente cliente = cService.obtenerClientePorCodigo(pedido.getCodigoCliente());
		List<Detalle> detalle = pService.obtenerDetalleDeUnPedido(txtCodigo);
		model.addAttribute( "pedido" , pedido);
		model.addAttribute( "detalle" , detalle);
		model.addAttribute( "cliente" , cliente);
		return vista;
	}
	
	@RequestMapping(value="/iniciarPedido.htm", method=RequestMethod.GET)
	public String vistaIniciarPedido(Model model){
		List<Cliente> lista = cService.obtenerTodosLosClientes();
		model.addAttribute( "clientes" , lista);
		model.addAttribute(new Pedido());
		return "viewIniciarPedido";
	}
	
	@RequestMapping(value="/iniciarPedido.htm",method=RequestMethod.POST)
	public String procesarInicioDePedido(@Valid Pedido pedido, BindingResult result, Model model,
			                             HttpServletRequest request, HttpSession session){
		List<Cliente> listaCliente = cService.obtenerTodosLosClientes();
		if (result.hasErrors()) {			
			model.addAttribute( "clientes" , listaCliente);
			model.addAttribute(new Pedido());
			return "viewIniciarPedido";
		}
		if (pedido.getCodigoCliente().equals("Seleccione")) {
			model.addAttribute( "clientes" , listaCliente);
			model.addAttribute(new Pedido());
			return "viewIniciarPedido";
		}
		pedido.setDias(0);
		pedido.setEstado("Pendiente de pago");
		pService.registrarUnPedido(pedido);
		session.setAttribute("codigoPedido", pedido.getCodigoPedido());
		List<Maquinaria> lista = mService.ObtenerTodasLasMaquinarias();
		model.addAttribute("data", lista);
		return "viewListarMaquinaria";	
	}
	
	@RequestMapping(value="/anularPedido.htm", method=RequestMethod.GET)
	public String vistaAnularPedido(@RequestParam String code, Model model){
		String idmaq;
		Maquinaria maq;
		Pedido p = pService.obtnerPedidoPorCodigo(code);
		List<Detalle> lista = pService.obtenerDetalleDeUnPedido(code);
		for (Detalle detalle : lista) {
			idmaq = detalle.getCodigoMaquinaria();
			pService.eliminarDetallesDelPedido(detalle);
			maq = mService.obtenerMaquinariaPorCodigo(idmaq);
			maq.setEstado("Disponible");
			mService.actualizarMaquinaria(maq);
		}
		pService.eliminarUnPedido(p);
		model.addAttribute("msg", "El pedido de codigo "+code+" fue anulado con exito!");
		return "viewMensaje";
	}
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value="/agregarAlPedido.htm", method=RequestMethod.GET)
	public String agregarAlDetalle(@RequestParam String code, Model model,
			                       HttpServletRequest request, HttpSession session){
		session = request.getSession(); 
	    session = request.getSession(true);
	    ArrayList<Detalle> listaDetalle;
	    Maquinaria maq = mService.obtenerMaquinariaPorCodigo(code);
	    String vista;
	    if(maq.getEstado().equals("Disponible")){
		    if(session.getAttribute("codigoPedido")!=null){
			      if(session.getAttribute("detallePedido")!=null){
			    	  listaDetalle = (ArrayList<Detalle>) session.getAttribute("detallePedido");
			      }else{
			    	  listaDetalle = new ArrayList<Detalle>();
			      } 
				    Pedido ped = pService.obtnerPedidoPorCodigo((String) session.getAttribute("codigoPedido"));
				    Detalle detalle = new Detalle();
				    detalle.setCodigoDetalle(ped.getCodigoPedido()+maq.getCodigo());
				    detalle.setCodigoPedido(ped.getCodigoPedido());
				    detalle.setCodigoMaquinaria(maq.getCodigo());
				    detalle.setDescripcion(maq.getDescripcion());
				    detalle.setPrecio(maq.getPrecio());
				    detalle.setSubtotal(maq.getPrecio()*ped.getDias());
				    listaDetalle.add(detalle);
					session.setAttribute("detallePedido", listaDetalle);
					maq.setEstado("Reservado");
					mService.actualizarMaquinaria(maq);
					model.addAttribute( "maquinaria" , maq); 
					vista = "viewDetalleMaquinaria";
			    }else{
			    	model.addAttribute( "maquinaria" , maq); 
			    	model.addAttribute("mensaje", "Debe crear el pedido primero!");
			    	vista = "viewDetalleMaquinaria";
			    }    	
	    }else{
	    	model.addAttribute( "maquinaria" , maq); 
	    	model.addAttribute("mensaje", "La maquinaria ya se encuentra reservada!");
	    	vista = "viewDetalleMaquinaria";
	    } 
		return vista;	
	}
	
	@RequestMapping(value="/detallePedido.gsp", method=RequestMethod.GET)
	public String verDetalleDelPedido(){
		return "viewDetallePedido";
	}
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value="/finalizar.gsp", method=RequestMethod.GET)
	public String finalizarPedido(Model model, HttpServletRequest request, HttpSession session){
		String vista;
		if(session.getAttribute("detallePedido")!=null){
			ArrayList<Detalle> listaDetalle = (ArrayList<Detalle>) session.getAttribute("detallePedido");
			pService.registrarDetalle(listaDetalle);
			Pedido pedido = pService.obtnerPedidoPorCodigo(listaDetalle.get(0).getCodigoPedido());
			Cliente cliente = cService.obtenerClientePorCodigo(pedido.getCodigoCliente());
			model.addAttribute( "pedido" , pedido);
			model.addAttribute( "detalle" , listaDetalle);
			model.addAttribute( "cliente" , cliente);
			session = request.getSession(); 
	        session.invalidate(); 
			vista = "viewPedido";
		}else{
			model.addAttribute("msg", "La lista de pedido esta vacia!");
			vista = "viewMensaje";
		}
		return vista;
	}
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value="/quitar.gsp", method=RequestMethod.GET)
	public String quitarPedidDelDetalle(@RequestParam String id, Model model,
			                            HttpServletRequest request, HttpSession session){
		Maquinaria maq = mService.obtenerMaquinariaPorCodigo(id);
		maq.setEstado("Disponible");
		mService.actualizarMaquinaria(maq);
		ArrayList<Detalle> listaDetalle = (ArrayList<Detalle>) session.getAttribute("detallePedido");
		for (Detalle detalle : listaDetalle) {
			if(detalle.getCodigoMaquinaria().equals(id)){
				listaDetalle.remove(detalle);
			}
		}
		session.setAttribute("detallePedido", listaDetalle);
		return "viewDetallePedido";
	}
	
	@RequestMapping(value="/pagar.gsp", method=RequestMethod.GET)
	public String realizarPago(@RequestParam String code, Model model){
		Pedido ped = pService.obtnerPedidoPorCodigo(code);
		 model.addAttribute( "pedido" , ped);     
		return "viewPagarPedido";
	}
	
	@RequestMapping(value="/pagar.gsp",method=RequestMethod.POST)
	public String finalizarPago(@Valid Pedido pedido, BindingResult result, Model model){
		logger.debug("Entro a finalizar pago");
		if (result.hasErrors()) {
			return "viewPagarPedido";
		}
		pedido.setEstado("Cancelado");
		List<Detalle> listaDetalle = pService.obtenerDetalleDeUnPedido(pedido.getCodigoPedido());
		double s = 0;
		for (Detalle detalle : listaDetalle) {
			s = s + detalle.getPrecio()*pedido.getDias();
			detalle.setSubtotal(detalle.getPrecio()*pedido.getDias());
			pService.actualizarDetalle(detalle);
		}
		pedido.setTotal(s);
		pedido.setDescuento(s*pedido.getPorcentaje()*0.01);
		pedido.setTotalFinal(pedido.getTotal()-pedido.getDescuento());
		Cliente cliente = cService.obtenerClientePorCodigo(pedido.getCodigoCliente());
		pService.actualizarPedido(pedido);
		logger.debug("pService.actualizarPedido");
		Pedido ped = pService.obtnerPedidoPorCodigo(pedido.getCodigoPedido());
		logger.debug("total " + ped.getTotal());
		model.addAttribute( "pedido" , ped);
		model.addAttribute( "detalle" , listaDetalle);
		model.addAttribute( "cliente" , cliente);
		return "viewPedidoPagado";	
	}
	
	@RequestMapping(value="/verPedidos.gsp", method=RequestMethod.GET)
	public String vistaBuscarPedidoPorEstado(Model model, HttpSession session){
		model.addAttribute("user", session.getAttribute("user"));
		return "viewBuscarPedidoPorEstado";
	}
	
	@RequestMapping(value="/verPedidos.gsp",method=RequestMethod.POST)
	public String vistaBuscarPedidoPorEstado(@RequestParam String selectPedidoEstado, Model model, HttpSession session){
		if(selectPedidoEstado.equals("Seleccione")){
			model.addAttribute("user", session.getAttribute("user"));
			return "viewBuscarPedidoPorEstado";
		}
		List<Pedido> lista = pService.ObtenerTodosLosPedidosPorEstado(selectPedidoEstado); 
		model.addAttribute( "data" , lista);
		model.addAttribute( "pedEstado" , selectPedidoEstado);
		return "viewListarPedidos";
	}
	
	@RequestMapping(value="/verDetalle.gsp",method=RequestMethod.GET)
	public String detalleDeUnPedido(@RequestParam String id, Model model){
		logger.debug("Entro a detalle de un pedido");
		Pedido pedido = pService.obtnerPedidoPorCodigo(id);
		String vista;
		if(pedido.getEstado().equals("Cancelado")){
			vista = "viewPedidoPagado";
		}else{
			vista = "viewPedido";
		}
		Cliente cliente = cService.obtenerClientePorCodigo(pedido.getCodigoCliente());
		List<Detalle> detalle = pService.obtenerDetalleDeUnPedido(id);
		model.addAttribute( "pedido" , pedido);
		model.addAttribute( "detalle" , detalle);
		model.addAttribute( "cliente" , cliente);
		logger.debug("Salio de listar detalle de pedido");
		return vista;
	}
	
	/**
	public String truncarNumber(double num){
		NumberFormat nf = NumberFormat.getInstance(); 
		nf.setMaximumFractionDigits(2); 
		nf.setRoundingMode(RoundingMode.DOWN);
		String st=nf.format(num); 
		return st;
	}
	 */
	
	
}
